package com.example.lcode.binary;

/**
 *
 * 已知存在一个按非降序排列的整数数组 nums ，数组中的值不必互不相同。
 *
 * 在传递给函数之前，nums 在预先未知的某个下标 k（0 <= k < nums.length）上进行了 旋转 ，
 * 使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]（下标 从 0 开始 计数）。
 * 例如， [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。
 *
 * 给你 旋转后 的数组 nums 和一个整数 target ，请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ，则返回 true ，否则返回 false 。
 *
 * @version 1.0
 * @author: ChuJie_Lin
 * @since: 2021-11-09 12:25
 **/
public class Question81 {

    public boolean search(int[] nums, int target) {
        int i = searchTarget(nums, 0, nums.length - 1, target);
        if (i == -1) {
            return false;
        }
        return true;
    }

    private int searchTarget(int[] nums, int left, int right, int target) {
        if (left > right) {
            return -1;
        }
        int mid = (left + right) / 2;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] == nums[left] && nums[mid] == nums[right]) {
            return searchTarget(nums, left + 1, right - 1, target);
        } else if (nums[left] <= nums[mid]) {
            if (nums[left] <= target && nums[mid] >= target) {
                return searchTarget(nums, left, mid - 1, target);
            }
            return searchTarget(nums, mid + 1, right, target);
        } else {
            if (nums[right] >= target && nums[mid] <= target) {
                return searchTarget(nums, mid + 1, right, target);
            }
            return searchTarget(nums, left, mid - 1, target);
        }
    }

    public static void main(String[] args) {
        Question81 question81 = new Question81();
        int []arr = {1,0,1,1,1};
        question81.search(arr, 0);
    }

}
